# 封装  的作用，保护程序的安全
# 继承  的作用，代码的复用，方法的重写
# 多态  的作用，实现程序的可扩展性
# 权限控制 单下划线，双下划线，首尾双下划线
class Student():
    # 首尾双下划线
    def __init__(self, name, age, gender):
        self._name = name  # 受保护的，只能本类和子类访问
        self.__age = age  # 私有的，只能类本身去访问
        self.gemder = gender  # 普通的实例属性，类的内部，外部，及子类都可以访问，权限最大

    def _fun1(self):
        print('受保护的，本身及子类可以访问')

    def __fun2(self):
        print('私有的，只有定义的类可以访问')

    #  普通的实例方法
    def show(self):
        self._fun1()
        self.__fun2()
        print(self._name)
        print(self.__age)


# 创建一个学生类的对象
stu = Student('lily', 22, '女')
# 类的外部
print(stu._name)
# print(stu.__age)  # 出了定义范围，不可访问了
print(stu._Student__age)  # 私有实例属性可用这种方式访问，不推荐

stu._fun1()
# stu.__fun2()  # 出了定义范围，不可访问了
stu._Student__fun2()   # 私有方法可用这种方式访问，不推荐

print(dir(stu))
